package com.cyt.gen.service.impl;

import com.alibaba.fastjson.JSONArray;
import com.cyt.base.model.dto.ReturnResult;
import com.cyt.base.util.BaseUtil;
import com.cyt.base.util.ErrorCode;
import com.cyt.gen.dao.FormTableDao;
import com.cyt.gen.model.po.FormTool;
import com.cyt.gen.model.vo.FormFieldVo;
import com.cyt.gen.model.vo.FormTableFieldVo;
import com.cyt.gen.model.vo.FormTableVo;
import com.cyt.gen.model.vo.FormToolVo;
import com.cyt.gen.service.FormFieldService;
import com.cyt.gen.service.FormTableService;
import com.cyt.gen.service.FormToolService;
import com.cyt.sys.model.po.SysUser;
import com.cyt.sys.util.SysContant;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

/**
 * @author rong yuan
 * @date 2019/4/12 15:01
 */
@Service("formTableService")
public class FormTableServiceImpl implements FormTableService {

    private static final String ERROR_MSG_UPDATE_SUCCESS = "保存成功！";
    private static final String ERROR_MSG_UPDATE_FAILURE = "保存失败，请联系系统管理员！";

    @Resource
    private FormTableDao formTableDao;
    @Resource
    private FormToolService formToolService;
    @Resource
    private FormFieldService formFieldService;

    /**
     * 分页查询表信息
     *
     * @param formTableVo 传入参数对象
     * @param pageSize    页面数量
     * @param pageNum     当前页面
     * @return ReturnResult
     * @author rong yuan
     * @date 2019/4/12 15:04
     */
    @Override
    public ReturnResult pageTable(FormTableVo formTableVo, int pageSize, int pageNum) {
        PageHelper.startPage(pageNum, pageSize);
        List<FormTableVo> list = formTableDao.listTable(formTableVo);
        PageInfo<FormTableVo> page = new PageInfo<>(list);
        return new ReturnResult(page.getList(), page.getTotal(), page.isHasNextPage());
    }

    /**
     * list查询表信息
     *
     * @param formTableVo 传入参数对象
     * @return List<FormTableVo>
     * @author rong yuan
     * @date 2019/4/12 15:04
     */
    @Override
    public List<FormTableVo> listTable(FormTableVo formTableVo) {
        return formTableDao.listTable(formTableVo);
    }

    /**
     * 根据表名称获取表信息
     *
     * @param formTableVo 传入参数对象
     * @return FormTableVo
     * @author rong yuan
     * @date 2019/4/12 16:48
     */
    @Override
    public FormTableVo selectTableByTableName(FormTableVo formTableVo) {
        return formTableDao.selectTableByTableName(formTableVo);
    }

    /**
     * list查询表字段信息
     *
     * @param formTableVo 传入参数对象
     * @return List<FormTableFieldVo>
     * @author rong yuan
     * @date 2019/4/12 16:48
     */
    @Override
    public List<FormTableFieldVo> listTableField(FormTableVo formTableVo) {
        return formTableDao.listTableField(formTableVo);
    }

    /**
     * 新建数据库表
     *
     * @param formTableVo 传入参数对象
     * @return ReturnResult
     * @author rong yuan
     * @date 2019/4/15 10:39
     */
    @Override
    public ReturnResult createTable(FormTableVo formTableVo) {
        formTableVo.setFormTableFieldVoList(JSONArray.parseArray(formTableVo.getFormTableFieldVos(), FormTableFieldVo.class));
        try {
            formTableDao.dropTable(formTableVo);
            formTableDao.createTable(formTableVo);
            return new ReturnResult(ErrorCode.CODE_0, ERROR_MSG_UPDATE_SUCCESS);
        } catch (Exception e) {
            return new ReturnResult(ErrorCode.CODE_1, ERROR_MSG_UPDATE_FAILURE);
        }
    }

    /**
     * 保存表单设置
     *
     * @param formTableVo 传入参数对象
     * @param sysUser     用户信息
     * @return ReturnResult
     * @author rong yuan
     * @date 2019/4/16 16:46
     */
    @Override
    public ReturnResult saveOrUpdate(FormTableVo formTableVo, SysUser sysUser) {
        if (StringUtils.isNotBlank(formTableVo.getFormToolVos())) {
            //保存工具栏信息
            FormToolVo formToolVo = JSONArray.parseObject(formTableVo.getFormToolVos(), FormToolVo.class);
            formToolService.addOrUpdate(formToolVo, sysUser);
        }
        FormFieldVo vo = new FormFieldVo();
        vo.setTableName(formTableVo.getTableName());
        if (StringUtils.isNotBlank(formTableVo.getFormSearchVos())) {
            vo.setClassify(SysContant.FORM_FIELD_CLASSIFY_SEARCH);
            formFieldService.deleteByExample(vo);
            //保存搜索栏信息
            List<FormFieldVo> formSearchVoList = JSONArray.parseArray(formTableVo.getFormSearchVos(), FormFieldVo.class);
            for (FormFieldVo formFieldVo : formSearchVoList) {
                formFieldVo.setClassify(SysContant.FORM_FIELD_CLASSIFY_SEARCH);
                formFieldService.addOrUpdate(formFieldVo, sysUser);
            }
        }
        if (StringUtils.isNotBlank(formTableVo.getFormShowVos())) {
            vo.setClassify(SysContant.FORM_FIELD_CLASSIFY_SHOW);
            formFieldService.deleteByExample(vo);
            //保存搜索栏信息
            List<FormFieldVo> formShowVoList = JSONArray.parseArray(formTableVo.getFormShowVos(), FormFieldVo.class);
            for (FormFieldVo formFieldVo : formShowVoList) {
                formFieldVo.setClassify(SysContant.FORM_FIELD_CLASSIFY_SHOW);
                formFieldService.addOrUpdate(formFieldVo, sysUser);
            }
        }
        if (StringUtils.isNotBlank(formTableVo.getFormFieldVos())) {
            vo.setClassify(SysContant.FORM_FIELD_CLASSIFY_FIELD);
            formFieldService.deleteByExample(vo);
            //保存搜索栏信息
            List<FormFieldVo> formFieldVoList = JSONArray.parseArray(formTableVo.getFormFieldVos(), FormFieldVo.class);
            for (FormFieldVo formFieldVo : formFieldVoList) {
                formFieldVo.setClassify(SysContant.FORM_FIELD_CLASSIFY_FIELD);
                formFieldService.addOrUpdate(formFieldVo, sysUser);
            }
        }
        return new ReturnResult();
    }

    /**
     * 表格界面预览获取数据
     *
     * @param formTableVo 传入参数对象
     * @return FormTableVo
     * @author rong yuan
     * @date 2019/4/19 13:50
     */
    @Override
    public FormTableVo selectForPreviewList(FormTableVo formTableVo) {
        //工具栏信息
        FormTool formTool = new FormTool(formTableVo.getTableName());
        formTableVo.setFormTool(formToolService.selectOne(formTool));

        FormFieldVo formFieldVo = new FormFieldVo(formTableVo.getTableName());
        //搜索栏信息
        formFieldVo.setClassify(SysContant.FORM_FIELD_CLASSIFY_SEARCH);
        List<FormFieldVo> formSearchVoList = formFieldService.list(formFieldVo);
        if (formSearchVoList != null && formSearchVoList.size() > 0) {
            for (FormFieldVo vo : formSearchVoList) {
                vo.setField(BaseUtil.toTfmm(vo.getField()));
                if ("1".equals(vo.getIsRelated())) {
                    vo.setRelatedShowField(BaseUtil.toUpperCaseFirstOne(BaseUtil.toTfmm(vo.getRelatedShowField())));
                }
            }
        }
        formTableVo.setFormSearchVoList(formSearchVoList);
        //展示字段信息
        formFieldVo.setClassify(SysContant.FORM_FIELD_CLASSIFY_SHOW);
        List<FormFieldVo> formShowVoList = formFieldService.list(formFieldVo);
        if (formShowVoList != null && formShowVoList.size() > 0) {
            for (FormFieldVo vo : formShowVoList) {
                vo.setField(BaseUtil.toTfmm(vo.getField()));
                if ("1".equals(vo.getIsRelated())) {
                    vo.setRelatedShowField(BaseUtil.toUpperCaseFirstOne(BaseUtil.toTfmm(vo.getRelatedShowField())));
                }
            }
        }
        formTableVo.setFormShowVoList(formShowVoList);
        //字典码信息
        List<String> allSelectList = new ArrayList<>();
        FormFieldVo vo = new FormFieldVo();
        vo.setTableName(formTableVo.getTableName());
        vo.setType("select");
        vo.setClassify(SysContant.FORM_FIELD_CLASSIFY_SEARCH);
        List<FormFieldVo> searchSelectList = formFieldService.list(vo);
        getAllSelectList(searchSelectList, allSelectList);
        vo.setClassify(SysContant.FORM_FIELD_CLASSIFY_SHOW);
        List<FormFieldVo> showSelectList = formFieldService.list(vo);
        getAllSelectList(showSelectList, allSelectList);
        formTableVo.setSearchSelectList(searchSelectList);
        formTableVo.setShowSelectList(showSelectList);
        formTableVo.setAllSelectList(allSelectList);
        return formTableVo;
    }

    /**
     * 表单界面预览获取数据
     *
     * @param formTableVo 传入参数对象
     * @return FormTableVo
     * @author rong yuan
     * @date 2019/4/19 13:50
     */
    @Override
    public FormTableVo selectForPreviewEdit(FormTableVo formTableVo) {
        FormFieldVo formFieldVo = new FormFieldVo(formTableVo.getTableName());
        formFieldVo.setClassify(SysContant.FORM_FIELD_CLASSIFY_FIELD);
        List<FormFieldVo> formFieldVoList = formFieldService.list(formFieldVo);
        if (formFieldVoList != null && formFieldVoList.size() > 0) {
            for (FormFieldVo vo : formFieldVoList) {
                vo.setField(BaseUtil.toTfmm(vo.getField()));
                if ("1".equals(vo.getIsRelated())) {
                    vo.setRelatedShowField(BaseUtil.toUpperCaseFirstOne(BaseUtil.toTfmm(vo.getRelatedShowField())));
                }
            }
        }
        formTableVo.setFormFieldVoList(formFieldVoList);
        //字典码信息
        List<String> allSelectList = new ArrayList<>();
        FormFieldVo vo = new FormFieldVo();
        vo.setTableName(formTableVo.getTableName());
        vo.setType("select");
        vo.setClassify(SysContant.FORM_FIELD_CLASSIFY_FIELD);
        List<FormFieldVo> fieldSelectList = formFieldService.list(vo);
        getAllSelectList(fieldSelectList, allSelectList);
        formTableVo.setFieldSelectList(fieldSelectList);
        formTableVo.setAllSelectList(allSelectList);
        return formTableVo;
    }

    private void getAllSelectList(List<FormFieldVo> formFieldVoList, List<String> allSelectList) {
        if (formFieldVoList != null && formFieldVoList.size() > 0) {
            for (FormFieldVo formFieldVo : formFieldVoList) {
                formFieldVo.setField(BaseUtil.toTfmm(formFieldVo.getField()));
                if (!allSelectList.contains(formFieldVo.getCode())) {
                    allSelectList.add(formFieldVo.getCode());
                }
            }
        }
    }
}
